package ${enumFtlDO.packageName};

import lombok.Getter;
import java.util.Arrays;

@Getter
public enum ${enumFtlDO.name} {

<#list enumFtlDO.fields as field >
    /** ${field.desc}<#if field.comment??>: ${field.comment}</#if> */
    ${field.name}(<#if enumFtlDO.codeType=='String'>"</#if>${field.code}<#if enumFtlDO.codeType=='String'>"</#if>, "${field.desc}"),

</#list>
    ;

    // 编码
    private ${enumFtlDO.codeType} code;

    // 描述
    private String desc;

    ${enumFtlDO.name}(${enumFtlDO.codeType} code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    /** 获取 code 对应的枚举类型
     * @param code 枚举值
     * @return 不存在时返回 null
     */
    public static ${enumFtlDO.name} ofCode(${enumFtlDO.codeType} code) {
        return Arrays.stream(${enumFtlDO.name}.values())
                .filter(item -> item.code.equals(code))
                .findAny()
                .orElse(null);
    }

    /** 获取 desc 对应的枚举类型
     * @param desc 描述
     * @return 不存在时返回 null
     */
    public static ${enumFtlDO.name} ofDesc(String desc) {
        return Arrays.stream(${enumFtlDO.name}.values())
                .filter(item -> item.code.equals(desc))
                .findAny()
                .orElse(null);
    }

    /** 根据 desc 对应的 code
     * @param desc 描述
     * @param defaultCode 默认值
     * @return 不存在时返回默认值
     */
    public static ${enumFtlDO.codeType} getCode(String desc, ${enumFtlDO.codeType}... defaultCode) {
        ${enumFtlDO.name} ${enumFtlDO.name} = ofDesc(desc);
        return ${enumFtlDO.name} != null ?  ${enumFtlDO.name}.getCode() : defaultCode.length > 0 ? defaultCode[0] : null;
    }

    /** 根据 code 对应的 desc
     * @param code 编码
     * @param defaultDesc 默认值
     * @return 不存在时返回默认值
     */
    public static String getDesc(${enumFtlDO.codeType} code, String... defaultDesc) {
        ${enumFtlDO.name} ${enumFtlDO.name} = ofCode(code);
        return ${enumFtlDO.name} != null ?  ${enumFtlDO.name}.getDesc() : defaultDesc.length > 0 ? defaultDesc[0] : null;
    }

}
